package com.xingchi.tornado.storage.core;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.file.Path;

/**
 * 文件存储服务
 *
 * @author xingchi
 * @date 2024/4/8 21:35
 */
public interface FileStorageService {


    /**
     * 文件上传
     *
     * @param path 文件的存储路径
     * @return 文件在文件存储服务器上的路径唯一标识，在云存储中返回文件的对象名
     */
    String uploadFile(String path);

    /**
     * 文件上传
     *
     * @param path 文件存储路径
     * @return 文件在文件存储服务器上的路径唯一标识，在云存储中返回文件的对象名
     */
    String uploadFile(Path path);

    /**
     * 根据文件的字节上传文件
     *
     * @param bytes    文件的字节
     * @param fileName 文件的完整名称
     * @return 文件在文件存储服务器上的路径唯一标识，在云存储中返回文件的对象名
     */
    String uploadFile(byte[] bytes, String fileName);

    /**
     * 根据文件的输入流上传文件
     *
     * @param is       文件的输入流
     * @param fileName 文件的完整名称
     * @return 文件在文件存储服务器上的路径唯一标识，在云存储中返回文件的对象名
     */
    String uploadFile(InputStream is, String fileName);

    /**
     * 根据文件在文件服务器上的存储路径获取文件对应的字节书，注意文件过大可能会导致内存溢出问题
     *
     * @param path 文件的存储路径
     * @return 文件字节
     */
    byte[] getFileBytes(String path);

    default InputStream getInputStream(String path) {
        return new ByteArrayInputStream(getFileBytes(path));
    }

    /**
     * 删除文件
     *
     * @param path 文件的存储路径
     */
    void deleteFile(String path);

    /**
     * 获取文件的访问url
     *
     * @param path 文件的存储路径，在云存储中则为对应的对象名称
     * @return url
     */
    default String getUrl(String path) {
        return path;
    }

}
